/-boot
/-docs
/-editor
/-files ...
FileEntry.ts
FileList.ts
FolderEntry.ts
functions.ts
/-files-old
FileEntry.ts
FolderEntry.ts
impl.ts
/-imports
/-layout
/-shell
/-storage
/-tests
/-tests/files
FileList.ts
/-tests/storage
/-tests/storage/attached
AttachedStorageTests.ts
AttachedStorageTestsNew.ts
DomStorageTests.ts
IndexedDBStorageTests.ts
LocalStorageStorageTests.ts
WebSQLStorageTests.ts
TestCase.html
TestCase.ts
TestPage.css
TestPage.html
TestPage.ts
_sampleTests.ts
teapo-tests.html
teapo-tests.ts
/-typings
Dom.ts
TypeScriptService.ts
functions.ts
ko.ts
nteapo.html
persistence.api.ts
persistence.ts
shell.ts
teapo.html
teapo.ts
try.html
try.js
x
20
      files?: string[],
21
      private _attachFileEntry?: (fileEntry: FileEntry) => void,
22
      private _detachFileEntry?: (fileEntry: FileEntry) => void) {
23
      if (files) {
24
        for (var i = 0; i < files.length; i++) {
25
          this.file(files[i]);
26
        }
27
      }
28
    }
29
​
30
    /** Get or create file entry for a path. Creating FileEntry doesn't affect actual stored files, that is managed elsewhere. */
31
    file(path: string): FileEntry {
32
​
33
      var entry = this._fileByPath[path];
34
      if (entry) return entry;
35
​
36
      var pathParts: string[] = normalizePath(path);
37
      if (!pathParts.length) return null;
38
​
39
      var folder: FolderEntry;
40
      for (var i = 0; i < pathParts.length - 1; i++) {
41
        folder = this._addOrGetFolderEntry(pathParts[i], folder);
42
      }
43
​
44
      entry = this._addFileEntry(pathParts[pathParts.length - 1], folder);
45
​
46
      this._fileByPath[entry.path] = entry;
47
​
48
      return entry;
49
    }
50
​
51
    private _addOrGetFolderEntry(name: string, parent: FolderEntry) {
52
      var folders = parent ? parent.folders : this.folders;
53
      var result = find(
54
        folders(),
55
        (f, index) => {
56
          if (f.name < name) return;
57
          if (f.name === name) return f;
58
          var result = this._createFolderEntry(parent, name);
59
          folders.splice(index, 0, result);
60
          return result;
61
        });
62
      if (!result) {
63
        result = this._createFolderEntry(parent, name);
64
        folders.push(result);
65
      }
66
      return result;
67
    }
68
​
69
    private _addFileEntry(name: string, parent: FolderEntry) {
70
      var siblings = parent ? parent.files : this.files;
71
​
72
      var result = find(
73
        siblings(),
74
        (f, index) => {
75
          if (f.name < name) return;
76
          if (f.name === name) return f;
77
          var result = this._createChildFileEntry(parent, name);
78
          siblings.splice(index, 0, result);
79
          return result;
80
        });
81
​
82
      if (!result) {
83
        result = this._createChildFileEntry(parent, name);
84
        siblings.push(result);
85
      }
86
​
87
      return result;
88
    }
89
​
90
    private _createFolderEntry(parent: FolderEntry, name: string) {
91
      var f = new FolderEntry(parent, name);
92
      return f;
93
    }
94
​
95
    private _createChildFileEntry(parent: FolderEntry, name: string) {
96
      var f = new FileEntry(parent, name);
97
      this._attachFileEntry(f);
98
      return f;
99
    }
100
​
101
  }
102
​
103
}
79:11